package control;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import algorithm.IAlgOperation;
import algorithm.SAElem;
import foundation.fileUtil.TxtFileUtil;
import foundation.fileUtil.XMLmodifyUtil;
import foundation.pcmUtil.SimulatorMouse;

public abstract class CtrlEngine implements IAlgOperation {
	protected SAModifier saMdfier = null;// SA修改器
	protected PerfEvaluator perfElvor = null;// 性能评估器
	protected RelbEvaluator relbElvor = null;// 可靠性评估器
	protected ExeCtx exeCtx = null;// 执行上下文

	/**
	 * 
	 * @param exeCtx：执行上下文
	 * @param saMdfier：修改器，可根据自由度编码修改SA
	 * @param perfElvor：性能评估器，用于获取性能指标
	 * @param relbElvor：可靠性评估器，用于获取可靠性指标
	 */
	public CtrlEngine(ExeCtx exeCtx, SAModifier saMdfier, PerfEvaluator perfElvor, RelbEvaluator relbElvor) {
		this.exeCtx = exeCtx;
		this.saMdfier = saMdfier;
		this.perfElvor = perfElvor;
		this.relbElvor = relbElvor;
	}

	/**
	 * 获取染色体的适应度值，目前仅考虑性能指标
	 * 
	 * @param codes:染色体编码
	 * @return 目标值
	 */
	public abstract List<StringBuffer> getObjVals(List<StringBuffer> codes);

	/**
	 * 个体编码的变异
	 * 
	 * @param mutateNum:变异数量
	 * @param codes:染色体编码
	 * @param random:随机数类
	 * @param mutatePorb:变异概率
	 * @return 变异后个体编码
	 */
	public abstract List<StringBuffer> mutate(int mutateNum, List<StringBuffer> codes, Random random, float mutatePorb);

	/**
	 * 装配变更元素
	 * 
	 * @param codes:染色体编码
	 * @return 变更元素序列
	 */
	public abstract ArrayList<SAElem> getChgedElems(List<StringBuffer> codes);

	/**
	 * 判断个体编码是否合法
	 * 
	 * @param codes:染色体编码
	 * @return 是否合法
	 */
	public abstract boolean isLegalCodes(List<StringBuffer> codes);

	/**
	 * 对不合法的编码进行修复
	 * 
	 * @param codes:染色体编码
	 * @return 修复后的编码
	 */
	public abstract List<StringBuffer> repairCodes(List<StringBuffer> codes);

	/**
	 * 获取响应时间
	 */
	public float getResTime() {
		return perfElvor.getPerfIndice().getResTime();
	}
	
	public String getFeasibility(){
		return XMLmodifyUtil.getXmlValue("feasibility");
	}
	public String getTotalCost(){
		return XMLmodifyUtil.getXmlValue("cost");
	}

	/**
	 * 读取可靠性值
	 */
	public float getReltVal() {
		return relbElvor.getReltVal();
	}

	/**
	 * 计算代价
	 * 
	 * @param fdCodes
	 * @return
	 */
	public abstract float getCost(List<StringBuffer> fdCodes);

	/**
	 * @return：性能、可靠性和代价指标值
	 */
	public List<StringBuffer> readIndice() {
		List<StringBuffer> indice = new ArrayList<StringBuffer>();
		// 读报告值并装配结果
		StringBuffer strb = new StringBuffer();
		strb.append(getFeasibility());
		indice.add(strb);
		StringBuffer strb1 = new StringBuffer();
		strb1.append(getTotalCost());
		indice.add(strb1);
		return indice;
	}

	public ExeCtx getExeCtx() {
		return exeCtx;
	}

	public void setExeCtx(ExeCtx exeCtx) {
		this.exeCtx = exeCtx;
	}

	public SAModifier getSaMdfier() {
		return saMdfier;
	}

	public void setSaMdfier(SAModifier saMdfier) {
		this.saMdfier = saMdfier;
	}

	public PerfEvaluator getPerfElvor() {
		return perfElvor;
	}

	public void setPerfElvor(PerfEvaluator perfElvor) {
		this.perfElvor = perfElvor;
	}

	public RelbEvaluator getRelbElvor() {
		return relbElvor;
	}

	public void setRelbElvor(RelbEvaluator relbElvor) {
		this.relbElvor = relbElvor;
	}

}
